package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.constant.StdZbHandleEnums.StdZbHandleEnum;
import com.fdb.basic.framework.core.util.DateUtility;
import com.fdb.basic.framework.core.util.StringUtil;
import com.fdb.efp.nls.service.vo.LogErrorInfoVO;
import com.fdb.efp.nls.service.facade.ImageFileAnalysisAlrmService;
import com.fdb.efp.nls.service.facade.LogErrorInfoService;
import com.fdb.efp.esb.service.bo.req.hlw.ReqAlarmJudgementBean;
import com.fdb.efp.esb.service.bo.resp.hlw.RespAlarmJudgementBean;
import com.fdb.efp.esb.service.facade.hlw.AlarmJudgementService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.net.InetAddress;
import java.util.*;

/**
 * 
 * 1、影像文件所有影像件交互所有场景告警<br/>
 * 
 * @author ludayong
 * @since 2019年1月25日 下午8:48:56
 * @version 1.0
 */
@Service("imageFileAnalysisAlrmService")
public class ImageFileAnalysisAlrmServiceImpl implements ImageFileAnalysisAlrmService {

	private static Logger logger = LoggerFactory.getLogger(ImageFileAnalysisAlrmServiceImpl.class);
	@Autowired
	@Qualifier("logErrorInfoService")
	private LogErrorInfoService imageLogErrorInfoService;// 影像异常信息
	@Autowired
	@Qualifier("alarmJudgementService")
	private AlarmJudgementService alarmJudgementService;// 告警服务

	/**
	 * 影像文件所有影像件交互告警服务 <br>
	 * 
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月25日 下午8:48:56
	 * @version 1.0
	 */
	public synchronized void noticeAlrmInfTotal() throws Exception {
		List<String> states = new ArrayList<String>();
		states.add(StdZbHandleEnum.PENDING.getEnname());// 未处理

		/**************** 影像文件 ******************/
		// 根据处理状态
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getEnname() + "、" + MonAlrmLvlEnum.COMMON.getEnname() + "】，查询影像文件处理错误信息开始！");
		List<LogErrorInfoVO> logErrorInfoListLvl1 = imageLogErrorInfoService.queryByErrorTypeStates(MonAlrmLvlEnum.COMMON.getEnname(),
				states);// 错误级别
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getCnname() + "、" + MonAlrmLvlEnum.COMMON.getCnname() + "】查询影像文件处理错误信息，条数为：【"
				+ logErrorInfoListLvl1.size() + "】");

		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getEnname() + "、" + MonAlrmLvlEnum.WARNING.getEnname() + "】，查询影像文件处理错误信息开始！");
		List<LogErrorInfoVO> logErrorInfoListLvl2 = imageLogErrorInfoService.queryByErrorTypeStates(MonAlrmLvlEnum.WARNING.getEnname(),
				states);// 错误级别
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getCnname() + "、" + MonAlrmLvlEnum.WARNING.getCnname() + "】查询影像文件处理错误信息，条数为：【"
				+ logErrorInfoListLvl2.size() + "】");

		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getEnname() + "、" + MonAlrmLvlEnum.SERIOUS.getEnname() + "】，查询影像文件处理错误信息开始！");
		List<LogErrorInfoVO> logErrorInfoListLvl3 = imageLogErrorInfoService.queryByErrorTypeStates(MonAlrmLvlEnum.SERIOUS.getEnname(),
				states);// 错误级别
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getCnname() + "、" + MonAlrmLvlEnum.SERIOUS.getCnname() + "】查询影像文件处理错误信息，条数为：【"
				+ logErrorInfoListLvl3.size() + "】");

		logger.info(
				"根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getEnname() + "、" + MonAlrmLvlEnum.DEADLINGESS.getEnname() + "】，查询影像文件处理错误信息开始！");
		List<LogErrorInfoVO> logErrorInfoListLvl4 = imageLogErrorInfoService.queryByErrorTypeStates(MonAlrmLvlEnum.DEADLINGESS.getEnname(),
				states);// 错误级别
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getCnname() + "、" + MonAlrmLvlEnum.DEADLINGESS.getCnname()
				+ "】查询影像文件处理错误信息，条数为：【" + logErrorInfoListLvl4.size() + "】");

		List<LogErrorInfoVO> listAll = new ArrayList<LogErrorInfoVO>();
		int total = 0;// 错误信息数
		StringBuffer sb = new StringBuffer();
		sb.append("影像文件处理错误信息：");
		if (Objects.nonNull(logErrorInfoListLvl1) && !logErrorInfoListLvl1.isEmpty()) {
			listAll.addAll(logErrorInfoListLvl1);
			total += logErrorInfoListLvl1.size();
			sb.append("级别[" + MonAlrmLvlEnum.COMMON.getCnname() + "]条数为" + logErrorInfoListLvl1.size() + "；");
		}
		if (Objects.nonNull(logErrorInfoListLvl2) && !logErrorInfoListLvl2.isEmpty()) {
			listAll.addAll(logErrorInfoListLvl2);
			total += logErrorInfoListLvl2.size();
			sb.append("级别[" + MonAlrmLvlEnum.WARNING.getCnname() + "]条数为" + logErrorInfoListLvl2.size() + "；");
		}
		if (Objects.nonNull(logErrorInfoListLvl3) && !logErrorInfoListLvl3.isEmpty()) {
			listAll.addAll(logErrorInfoListLvl3);
			total += logErrorInfoListLvl3.size();
			sb.append("级别[" + MonAlrmLvlEnum.SERIOUS.getCnname() + "]条数为" + logErrorInfoListLvl3.size() + "；");
		}
		if (Objects.nonNull(logErrorInfoListLvl4) && !logErrorInfoListLvl4.isEmpty()) {
			listAll.addAll(logErrorInfoListLvl4);
			total += logErrorInfoListLvl4.size();
			sb.append("级别[" + MonAlrmLvlEnum.DEADLINGESS.getCnname() + "]条数为" + logErrorInfoListLvl4.size() + "；");
		}

		if (total > 0) {
			String alrmInf = sb.toString();
			// 调用告警判断服务
			ReqAlarmJudgementBean imageFileReqBean = new ReqAlarmJudgementBean();
			imageFileReqBean.setMonObjNm("网贷批量");
			imageFileReqBean.setMonObjSpfTpVal("网贷批量");
			try {
				imageFileReqBean.setMonObjLctr(InetAddress.getLocalHost().getHostAddress());// 应用地址
			} catch (Exception e) {
				imageFileReqBean.setMonObjLctr("efp_edoc");
			}
			imageFileReqBean.setAlrmInf(alrmInf);
			imageFileReqBean.setAlrmTmstmp(DateUtility.getCurrAppDateTimeString());
			imageFileReqBean.setMonAlrmLvl("2");
			RespAlarmJudgementBean imageFileRespBean = alarmJudgementService.alarmJudgement(imageFileReqBean);
			logger.info("调用告警返回码：【" + imageFileRespBean.getRetCd() + "】，返回信息：【" + imageFileRespBean.getRetMsg() + "】");

			if (Objects.nonNull(imageFileRespBean) && "0000".equals(imageFileRespBean.getRetCd())) {// 调用告警成功
				Map<String, Object> paramMap = new HashMap<String, Object>();
				paramMap.put("state", StdZbHandleEnum.HANGING.getEnname());// 处理中
				paramMap.put("list", listAll);// 处理中
				int num = imageLogErrorInfoService.updateStateBySernos(paramMap);// 更新已告警的信息

				logger.info("更新影像文件处理错误信息状态为【" + StdZbHandleEnum.HANGING.getCnname() + "】的信息数：【" + num + "】");
			}
		}
		logger.info("根据处理状态、错误类别：【" + StdZbHandleEnum.PENDING.getCnname() + "、" + MonAlrmLvlEnum.WARNING.getEnname() + "】，查询影像文件处理错误信息结束！");
		/**************** 影像文件 ******************/
	}

	/**
	 * 影像文件所有影像件交互告警服务 <br>
	 * 
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月25日 下午8:48:56
	 * @version 2.0
	 * @updator wanglaisheng 2020年12月1日 优化警告逻辑，只警告第一条错误信息，并且告知错误数量
	 */
	@Override
	public synchronized void noticeAlrmInf() throws Exception {
		List<String> states = new ArrayList<String>();
		states.add(StdZbHandleEnum.PENDING.getEnname());// 未处理

		/**************** 影像文件 ******************/
		// 根据处理状态
		logger.info("根据处理状态【" + StdZbHandleEnum.PENDING.getEnname() + "】，查询影像文件处理错误信息开始！");
		List<LogErrorInfoVO> logErrorInfoListLvl = imageLogErrorInfoService.queryByStates(states);// 错误级别
		logger.info("根据处理状态【" + StdZbHandleEnum.PENDING.getCnname() + "】查询影像文件处理错误信息，条数为：【" + logErrorInfoListLvl.size() + "】");

		if (Objects.nonNull(logErrorInfoListLvl) && !logErrorInfoListLvl.isEmpty()) {
			Map<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put("state", StdZbHandleEnum.HANGING.getEnname());// 处理中
			// 调用告警判断服务
			ReqAlarmJudgementBean imageFileReqBean = new ReqAlarmJudgementBean();
			imageFileReqBean.setMonObjNm("网贷批量");
			imageFileReqBean.setMonObjSpfTpVal("网贷批量");
			try {
				imageFileReqBean.setMonObjLctr(InetAddress.getLocalHost().getHostAddress());// 应用地址
			} catch (Exception e) {
				imageFileReqBean.setMonObjLctr("efp_edoc");
			}
			LogErrorInfoVO logErrorInfoVO = logErrorInfoListLvl.get(0);
			imageFileReqBean.setAlrmInf((StringUtil.isNullorBank(logErrorInfoVO.getErrorMsg())?logErrorInfoVO.getRemark():logErrorInfoVO.getErrorMsg()) + " " +
					"条数为："+logErrorInfoListLvl.size());
			imageFileReqBean.setAlrmTmstmp(DateUtility.getCurrAppDateTimeString());
			imageFileReqBean.setMonAlrmLvl(logErrorInfoVO.getErrorType());
			RespAlarmJudgementBean imageFileRespBean = alarmJudgementService.alarmJudgement(imageFileReqBean);
			logger.info("调用告警返回码：【" + imageFileRespBean.getRetCd() + "】，返回信息：【" + imageFileRespBean.getRetMsg() + "】");
			if (Objects.nonNull(imageFileRespBean) && "0000".equals(imageFileRespBean.getRetCd())) {// 调用告警成功
			for (LogErrorInfoVO logErrorInfo : logErrorInfoListLvl) {
					List<LogErrorInfoVO> list = new ArrayList<LogErrorInfoVO>();
					list.add(logErrorInfo);
					paramMap.put("list", list);// 处理中
					int num = imageLogErrorInfoService.updateStateBySernos(paramMap);// 更新已告警的信息

					logger.info("更新影像文件处理错误信息状态为【" + StdZbHandleEnum.HANGING.getCnname() + "】的信息数：【" + num + "】");
				}
			}
		}
		logger.info("根据处理状态【" + StdZbHandleEnum.PENDING.getCnname() + "】，查询影像文件处理错误信息结束！");
		/**************** 影像文件 ******************/
	}
}
